/*
 * FreenectAdapter.h
 *
 */

#ifndef FREENECTADAPTER_H_
#define FREENECTADAPTER_H_

#include "FreenectAdaptee.h"
#include "Kinect.h"

namespace kinect {

/**
 * \class FreenectAdapter
 * @brief Classe che incapsula i metodi per la connessione con un device Microsoft Kinect e la sua gestione.
 * @details Microsoft Kinect e' dotato di telecamera RGB, doppio sensore di profondit�� a raggi infrarossi composto da un proiettore a infrarossi e da una telecamera sensibile alla stessa banda. La telecamera RGB ha una risoluzione di 640 �� 480 pixel, mentre quella a infrarossi usa una matrice di 320 �� 240 pixel. Kinect dispone anche di un array di microfoni utilizzato dal sistema per la calibrazione dell'ambiente in cui ci si trova, mediante l'analisi della riflessione del suono sulle pareti e sull'arredamento.
 * @date May 25, 2012
 * @author Gennaro Capo
 * @author Mirko Conte
 * @author Vincenzo De Notaris
 * @author Roberto Pacilio
 * @version 1.0
 * @namespace kinect
 * @see libfreenect::FreenectAdaptee
 * @see kinect::Kinect
 */
class FreenectAdapter : public Kinect {

public:

	/**
	 * Metodo per la costruzione dell'unica istanza possibile (singleton) della classe FreenectAdapter.
	 * @param id indice associato dal sistema operativo al device Microsoft Kinect che si intende utilizzare.
	 * @return istanza della classe KinectConnector; essendo questa unica (in accordo al pattern singleton), inovocazioni successive di questo metodo restituiranno l'oggetto istanziato tramite la prima chiamata.
	 */
	static FreenectAdapter* getInstance(unsigned short int id = 0);

	/**
	 * Metodo per la distruzione dell'unica istanza possibile (singleton) della classe FreenectAdapter.
	 */
	void release();

	/**
	 * Metodo che restituisce l'indice associato al device Microsoft Kinect utilizzato.
	 * @return indice associato al device Microsoft Kinect utilizzato.
	 */
	unsigned short int getId() const;

	/**
	 * Metodo per lo starting della cattura dei frame da parte della camera standard.
	 */
	void startBGRCapture();

	/**
	 * Metodo per fermare la cattura dei frame da parte della camera standard.
	 */
	void stopBGRCapture();

	/**
	 * Metodo per lo starting della cattura dei frame da parte della camera IR.
	 */
	void startDepthCapture();

	/**
	 * Metodo per fermare la cattura dei frame da parte della camera IR.
	 */
	void stopDepthCapture();

	/**
	 * Metodo per controllare se la cattura delle immagini BGR �� iniziata o meno.
	 * @return true se la cattura delle immagini BGR �� iniziata, false altrimenti.
	 */
	bool isBGRStarted() const;

	/**
	 * Metodo per controllare se la cattura delle immagini di prodonfita' �� iniziata o meno.
	 * @return true se la cattura delle immagini di profondita' �� iniziata, false altrimenti.
	 */
	bool isDepthStarted() const;

	/**
	 *
	 * @param dest
	 */
	void getBGRFrame(cv::Mat &dest);

	/**
	 *
	 * @param dest
	 */
	void getDepthFrame(cv::Mat &dest);

	void alza();

	void abbassa();

	void azzera();

private:

	/*
	 * Costruttore della classe FreenectAdapter.
	 */
	explicit FreenectAdapter(unsigned short int id);

	/*
	 * Previene dalla costruzione mediante copia.
	 */
	FreenectAdapter(const FreenectAdapter&);

	/*
	 * Previene l'assegnamento.
	 */
	FreenectAdapter& operator = (const FreenectAdapter&);

	/*
	 * Distruttore della classe FreenectAdapter.
	 */
	~FreenectAdapter();

	/*
	 * Puntatore associato ad un istanza della classe Freenect.
	 */
	Freenect::Freenect* _freenect;

	/*
	 * Puntatore associato ad un istanza della classe FreenectAdaptee.
	 */
	libfreenect::FreenectAdaptee* _adaptee;

	/*
	 *  Istanza unica della classe FreenectAdpater.
	 */
	static FreenectAdapter* _instance;

	/*
	 * Indice associato al device Microsoft Kinect utilizzato.
	 */
	unsigned short int _id;

	/*
	 * Variabile booleana associata alla cattura da parte del device dei frame dalla camera standard.
	 */
	bool _bgr_capture;

	/*
	 * Variabile booleana associata alla cattura da parte del device dei frame di profondita'.
	 */
	bool _depth_capture;

};

} /* namespace kinect */
#endif /* FREENECTADAPTER_H_ */
